package com.huawei.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;
import java.util.UUID;

/**
 * JWT工具类
 */
public class JwtUtil {

      //有效期为
      public static final Long JWT_TTL = 60 * 60 *1000L;// 60 * 60 *1000  一个小时
      //设置秘钥明文
      public static final String JWT_KEY = "java";

      public static String getUUID(){
            String token = UUID.randomUUID().toString().replaceAll("-", "");
            return token;
     }
      
      /**
       * 生成jtw
       * @param subject token中要存放的数据（json格式）
       * @return
       */
      public static String createJWT(String subject) {
            JwtBuilder builder = getJwtBuilder(subject, null, getUUID());// 设置过期时间
            return builder.compact();
     }

      /**
       * 生成jtw
       * @param subject token中要存放的数据（json格式）
       * @param ttlMillis token超时时间
       * @return
       */
      public static String createJWT(String subject, Long ttlMillis) {
            JwtBuilder builder = getJwtBuilder(subject, ttlMillis, getUUID());// 设置过期时间
            return builder.compact();
     }

      private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) {
            SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
            SecretKey secretKey = generalKey();
            long nowMillis = System.currentTimeMillis();
            Date now = new Date(nowMillis);
            if(ttlMillis==null){
                  ttlMillis=JwtUtil.JWT_TTL;
           }
            long expMillis = nowMillis + ttlMillis;
            Date expDate = new Date(expMillis);
            return Jwts.builder()
                       .setId(uuid)                     //唯一的ID
                       .setSubject(subject)    // 主题  可以是JSON数据
                       .setIssuer("szay2005")       // 签发者
                       .setIssuedAt(now)         // 签发时间
                       .signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签名, 第二个参数为秘钥
                       .setExpiration(expDate);
     }

      /**
       * 创建token
       * @param id
       * @param subject
       * @param ttlMillis
       * @return
       */
      public static String createJWT(String id, String subject, Long ttlMillis) {
            JwtBuilder builder = getJwtBuilder(subject, ttlMillis, id);// 设置过期时间
            return builder.compact();
     }

      public static void main(String[] args) throws Exception {
//           String jwt = createJWT("hello");
            Claims claims = parseJWT("eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIyOTY2ZGE3NGYyZGM0ZDAxOGU1OWYwNjBkYmZkMjZhMSIsInN1YiI6IjIiLCJpc3MiOiJzZyIsImlhdCI6MTYzOTk2MjU1MCwiZXhwIjoxNjM5OTY2MTUwfQ.NluqZnyJ0gHz-2wBIari2r3XpPp06UMn4JS2sWHILs0");
            String subject = claims.getSubject();
            System.out.println(subject);
//           System.out.println(claims);
     }

      /**
       * 生成加密后的秘钥 secretKey
       * @return
       */
      public static SecretKey generalKey() {
            byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);
            SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
            return key;
     }
      
      /**
       * 解析
       *
       * @param jwt
       * @return
       * @throws Exception
       */
      public static Claims parseJWT(String jwt) throws Exception {
            SecretKey secretKey = generalKey();
            return Jwts.parser()
                       .setSigningKey(secretKey)
                       .parseClaimsJws(jwt)
                       .getBody();
     }


}
